﻿using System;
using System.Collections.Generic;
using UD.GRAL.Entity;
using UD.SYSEXTUD.MASTER;
using System.Web.UI.WebControls;
using UD.Utilities.Exceptions;
using UD.EXTUD.Service;
using Icbf.EXTUD.Entity;
using System.Linq.Expressions;
using System.Linq;

namespace UD.SYSEXTUD.CURSOS
{
    public partial class List : System.Web.UI.Page
    {
        EXTUDService oEXTUDService = new EXTUDService();

        /// <summary>
        /// Guarda el criterio de ordenamiento de la grilla
        /// </summary>
        public string GridViewSortExpression
        {
            get { return (string)ViewState["sortExpression"]; }
            set { ViewState["sortExpression"] = value; }
        }

        /// <summary>
        /// Guarda la dirección de ordenamiento del gridview
        /// </summary>
        public SortDirection GridViewSortDirection
        {
            get
            {
                if (ViewState["sortDirection"] == null)
                    ViewState["sortDirection"] = SortDirection.Ascending;

                return (SortDirection)ViewState["sortDirection"];
            }
            set { ViewState["sortDirection"] = value; }
        }

        protected void Page_PreInit(object sender, EventArgs e)
        {
            UtilesHelper.SetTituloPagina(this.Master, Request.QueryString[UtilesHelper.queryStringTituloPagina]);
            SYSEXTUDMasterPage masterPage = (SYSEXTUDMasterPage)this.Master;
            masterPage.eventoNuevo += new MasterPageDelegate(masterPage_eventoNuevo);
            masterPage.eventoBuscar += new MasterPageDelegate(masterPage_eventoBuscar);
        }


        void masterPage_eventoBuscar(object sender, EventArgs e)
        {
            Buscar();
        }

        void masterPage_eventoNuevo(object sender, EventArgs e)
        {
            Response.Redirect("Add.aspx?titulo=REGISTRO CURSOS");
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                CargarDatosIniciales();
            }
        }

        private void CargarDatosIniciales()
        {
            CargarDropDownTiposCurso();
            CargarDropDownFacultad();
            CargarDropDownProyectosCurricularesFacultad();
        }

        private void CargarDropDownTiposCurso()
        {
            ddlTipoCurso.DataValueField = UtilesHelper.ddDataValueFieldTipoCurso;
            ddlTipoCurso.DataTextField = UtilesHelper.ddDataTextFieldTipoCurso;
            ddlTipoCurso.DataSource = Application[UtilesHelper.appGRALTiposCursos];
            ddlTipoCurso.DataBind();
            ddlTipoCurso.Items.Insert(0, new ListItem(Server.HtmlDecode("Seleccione el tipo de curso"), UtilesHelper.cValorInicialDropdown));
        }

        private void CargarDropDownFacultad()
        {
            ddlTipoFacultad.DataValueField = UtilesHelper.ddDataValueFieldFacultad;
            ddlTipoFacultad.DataTextField = UtilesHelper.ddDataTextFieldFacultad;
            ddlTipoFacultad.DataSource = Application[UtilesHelper.appGRALFacultadesUD];
            ddlTipoFacultad.DataBind();
            ddlTipoFacultad.Items.Insert(0, new ListItem(Server.HtmlDecode("Seleccione la facultad"), UtilesHelper.cValorInicialDropdown));
        }

        private void CargarDropDownProyectosCurricularesFacultad()
        {
            ddlProyectoCurricular.Items.Insert(0, new ListItem(Server.HtmlDecode("Seleccione el proyecto curricular"), UtilesHelper.cValorInicialDropdown));
        }

        private void CargarDropDownProyectosCurricularesFacultad(int pIdFacultad)
        {
            List<ProyectoCurricularUD> listaTotalProyectoCurriculares = (List<ProyectoCurricularUD>)Application[UtilesHelper.appGRALProyectosCurricularesUD];
            listaTotalProyectoCurriculares = listaTotalProyectoCurriculares.FindAll(proyectoCurricular => proyectoCurricular.IdFacultad.Equals(pIdFacultad));
            ddlProyectoCurricular.DataValueField = UtilesHelper.ddDataValueFieldProyectoCurricular;
            ddlProyectoCurricular.DataTextField = UtilesHelper.ddDataTextFieldProyectoCurricular;
            ddlProyectoCurricular.DataSource = listaTotalProyectoCurriculares;
            ddlProyectoCurricular.DataBind();
            ddlProyectoCurricular.Items.Insert(0, new ListItem(Server.HtmlDecode("Seleccione el proyecto curricular"), UtilesHelper.cValorInicialDropdown));
        }

        protected void ddlTipoFacultad_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ddlTipoFacultad.SelectedValue != "-1")
            {
                CargarDropDownProyectosCurricularesFacultad(Convert.ToInt32(ddlTipoFacultad.SelectedValue));
            }
        }

        protected void gvCurso_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        protected void gvCurso_PageIndexChanging(object sender, System.Web.UI.WebControls.GridViewPageEventArgs e)
        {

        }

        protected void gvCurso_Sorting(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e)
        {

        }


        private void Buscar()
        {
            try
            {
                CargarGrilla(gvCurso, GridViewSortExpression, true);
            }
            catch (UserInterfaceException ex)
            {
                //toolBar.MostrarMensajeError(ex.Message);
            }
            catch (Exception ex)
            {
                //toolBar.MostrarMensajeError(ex.Message);
            }
        }


        /// <summary>
        /// Cargar una grilla con ordenamiento
        /// </summary>
        /// <param name="gridViewsender">Grilla a ordenar</param>
        /// <param name="expresionOrdenamiento">Columna que sirve de criterio para ordenar</param>
        /// <param name="cambioPaginacion">indica si el metodo se envia desde el evento PageIndexChanging de la grilla</param>
        private void CargarGrilla(BaseDataBoundControl gridViewsender, string expresionOrdenamiento, bool cambioPaginacion)
        {
            //////////////////////////////////////////////////////////////////////////////////
            //////Aqui va el código de llenado de datos para la grilla 
            //////////////////////////////////////////////////////////////////////////////////

            //Lleno una lista con los datos que uso para llenar la grilla
            try
            {
                int? vIdTipoCurso = null;
                String vNombreCurso = null;
                DateTime? vFechaInicioCurso = null;
                DateTime? vFechaFinalizacionCurso = null;
                Decimal? vValorCurso = null;
                int? vIdProyectoCurricular = null;
                if (UtilesHelper.ValidarSeleccionDropDownList(ddlTipoCurso))
                {
                    vIdTipoCurso = Convert.ToInt32(ddlTipoCurso.SelectedValue);
                }
                if (txtNombreCurso.Text != "")
                {
                    vNombreCurso = Convert.ToString(txtNombreCurso.Text);
                }
                if (txtFechaInicioCurso.Text != "")
                {
                    vFechaInicioCurso = Convert.ToDateTime(txtFechaInicioCurso.Text);
                }
                if (txtFechaFinalizacionCurso.Text != "")
                {
                    vFechaFinalizacionCurso = Convert.ToDateTime(txtFechaFinalizacionCurso.Text);
                }
                if (UtilesHelper.ValidarSeleccionDropDownList(ddlProyectoCurricular))
                {
                    vIdProyectoCurricular = Convert.ToInt32(ddlProyectoCurricular.SelectedValue);
                }
                var myGridResults = oEXTUDService.ConsultarCursos(vIdTipoCurso, vNombreCurso, vFechaInicioCurso, vFechaFinalizacionCurso, vValorCurso, vIdProyectoCurricular);
                //////////////////////////////////////////////////////////////////////////////////
                //////Fin del código de llenado de datos para la grilla 
                //////////////////////////////////////////////////////////////////////////////////

                if (expresionOrdenamiento != null)
                {
                    //Si la expresión de ordenamiento (columna) cambió, entonces la direccion de ordenamiento es ascendente
                    if (string.IsNullOrEmpty(GridViewSortExpression))
                    {
                        GridViewSortDirection = SortDirection.Ascending;
                    }
                    else if (GridViewSortExpression != expresionOrdenamiento)
                    {
                        GridViewSortDirection = SortDirection.Descending;
                    }
                    if (myGridResults != null)
                    {
                        var param = Expression.Parameter(typeof(Curso), expresionOrdenamiento);

                        //La propiedad de mi lista, esto es "Entidad.CualquierCampo"
                        var prop = Expression.Property(param, expresionOrdenamiento);

                        //Creo en tiempo de ejecución la expresión lambda
                        var sortExpression = Expression.Lambda<Func<Curso, object>>(Expression.Convert(prop, typeof(object)), param);

                        //Dependiendo del modo de ordenamiento . . .
                        if (GridViewSortDirection == SortDirection.Ascending)
                        {

                            //Si no viene del evento de paginacion (busqueda normal), entonces cambio la direccion de ordenamiento
                            if (cambioPaginacion == false)
                            {
                                GridViewSortDirection = SortDirection.Descending;
                                gridViewsender.DataSource = myGridResults.AsQueryable().OrderByDescending(sortExpression).ToList();
                            }
                            else
                            {
                                gridViewsender.DataSource = myGridResults.AsQueryable().OrderBy(sortExpression).ToList();
                            }
                        }
                        else
                        {

                            //Si no viene del evento de paginacion (busqueda normal), entonces cambio la direccion de ordenamiento
                            if (cambioPaginacion == false)
                            {
                                GridViewSortDirection = SortDirection.Ascending;
                                gridViewsender.DataSource = myGridResults.AsQueryable().OrderBy(sortExpression).ToList();
                            }
                            else
                            {
                                gridViewsender.DataSource = myGridResults.AsQueryable().OrderByDescending(sortExpression).ToList();
                            }
                        }

                        GridViewSortExpression = expresionOrdenamiento;
                    }
                }
                else
                {
                    gridViewsender.DataSource = myGridResults;
                }

                gridViewsender.DataBind();
            }
            catch (UserInterfaceException ex)
            {
                //toolBar.MostrarMensajeError(ex.Message);
            }
            catch (Exception ex)
            {
                //toolBar.MostrarMensajeError(ex.Message);
            }
        }

        public String BuscarTipoCurso(object idTipoCurso)
        {
            return ((List<TipoCurso>)Application[UtilesHelper.appGRALTiposCursos]).Find(tipo => tipo.IdTipoCurso.Equals((int)idTipoCurso)).NombreTipoCurso;   
        }


        public String BuscarProyectoCurricular(object idProyectoCurricular)
        {
            return ((List<ProyectoCurricularUD>)Application[UtilesHelper.appGRALProyectosCurricularesUD]).Find(tipo => tipo.IdProyectoCurricular.Equals((int)idProyectoCurricular)).NombreProyectoCurricular;
        }

        
    }
}